package controller;

import dao.ListaAlunoJpaController;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import dao.exceptions.NonexistentEntityException;
import java.util.ArrayList;
import java.util.Date;
import model.Aluno;
import model.CorrecaoListaAluno;
import model.DisciplinaProfessor;
import model.Lista;
import model.ListaAluno;
import model.ListaDisciplina;
import model.Matriculado;
import model.Turma;
import org.primefaces.model.DualListModel;
import pagecontroller.JsfUtil;

/**
 *
 * @author Edilson Fernandes da Costa
 * @version 1.0
 */
public class ListaAlunoController extends Controller {

    public ListaAlunoController() {
        if (JsfUtil.getObjectFromSession("ListaAlunoJpaController") == null) {
            jpaController = new ListaAlunoJpaController();
        } else {
            jpaController = (ListaAlunoJpaController) JsfUtil.getObjectFromSession("ListaAlunoJpaController");
        }
    }
    private ListaAluno listaAluno = null;
    private ListaAluno listaAlunoAux = null;
    private ListaAlunoJpaController jpaController = null;
    private List<ListaAluno> listaAlunos = null;
    private List<Turma> turmas;
    private List<DisciplinaProfessor> disciplinaProfessors;
    private DisciplinaProfessor disciplinaProfessor;
    private Turma turma;
    private DualListModel<Aluno> alunos;
    private List<Aluno> alunos2;
    private Aluno[] selectedAlunos;
    private List<Aluno> alunosLista;
    private List<ListaAluno> listaAlunosLista;
    private List<Turma> turmasDaLista;
    private Lista lista;
    private List<Aluno> pAlunos;
    private List<Aluno> pAlunos2;
    private Aluno selectedAluno;

    public void clear() {
        listaAluno = null;
        alunos2 = null;
        alunos = null;
        turmas = null;
        turma = null;
        disciplinaProfessors = null;
        disciplinaProfessor = null;

    }

    public String setPageListaAlunoSelect() {

        pAlunos = new ArrayList<Aluno>();
        pAlunos2 = new ArrayList<Aluno>();

        for (Matriculado m : getMatriculadoController().getMatriculados(getTurma())) {
            if (getAlunosLista().contains(m.getAluno())) {
                pAlunos2.add(m.getAluno());
            } else {
                pAlunos.add(m.getAluno());
            }
        }

        return getPageManager().setPageListaAlunoSelect();
    }

    public String persiste() {
        if (listaAluno.getId() == null) {
            return create();
        } else {
            return update();
        }
    }

    public String update() {
        try {
            jpaController.edit(this.listaAluno);
            listaAlunoAux = listaAluno;
            this.listaAluno = null;
            JsfUtil.addSuccessMessage("ListaAluno Atualizado com Sucesso");
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(ListaAlunoController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(ListaAlunoController.class.getName()).log(Level.SEVERE, null, ex);
        }
        return "refreshPage";
    }

    public String create() {
        try {

            listaAluno.setLista(getListaController().getListaAux());
            listaAluno.setDataAplicacao(new Date());
            listaAlunoAux = listaAluno;



            for (Aluno al : getPAlunos2()) {
//            for (Aluno al : selectedAlunos) {

                listaAluno = new ListaAluno();
                listaAluno.setLista(listaAlunoAux.getLista());
                listaAluno.setAvaliacao(listaAlunoAux.getAvaliacao());
                listaAluno.setDataAplicacao(listaAlunoAux.getDataAplicacao());
                listaAluno.setAluno(al);
                if (listaAluno.getId() == null) {
                    jpaController.create(listaAluno);
                } else {
                    jpaController.edit(listaAluno);
                }

                listaAlunoAux = listaAluno;
            }

            clear();
            getPageManager().setPageListaAlunoList();
            JsfUtil.addSuccessMessage(getPAlunos2().size() + " Alunos associados a lista com sucesso.");
        } catch (Exception e) {
            JsfUtil.ensureAddErrorMessage(e, "Ocorreu um erro na percistencia dos dados.");
            return null;
        }
        return "refreshPage";
    }

    public String edit() {
        ListaAluno listaAlunoTemp = (ListaAluno) JsfUtil.getObjectFromRequestParameter("listaAluno");
        this.listaAluno = listaAlunoTemp;
        return "refreshPage";
    }

    public String destroy() {
        ListaAluno listaAlunoTemp = (ListaAluno) JsfUtil.getObjectFromRequestParameter("listaAluno");
        try {
            jpaController.destroy(listaAlunoTemp.getId());
            JsfUtil.addSuccessMessage("ListaAluno removido com sucesso.");
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(ListaAlunoController.class.getName()).log(Level.SEVERE, null, ex);
        }

        return "refreshPage";
    }

    public ListaAluno getListaAluno() {
        if (listaAluno == null) {
            listaAluno = new ListaAluno();
        }
        return listaAluno;
    }

    public List<ListaAluno> getListaAlunos() {
        this.listaAlunos = jpaController.findListaAlunoEntities();
        return this.listaAlunos;
    }

    public ListaAlunoJpaController getJpaController() {
        return jpaController;
    }

    public ListaAluno getListaAlunoAux() {
        return listaAlunoAux;
    }

    public List<DisciplinaProfessor> getDisciplinaProfessors() {

        disciplinaProfessors = new ArrayList<DisciplinaProfessor>();
//        ListaDisciplinaController listaDisciplinaController = getListaDisciplinaController();
//        ListaController listaController = getListaController();
        List<ListaDisciplina> listaDisciplinas = getRenewListaDisciplinaController().getListaDisciplinas(getRenewListaController().getListaAux());
        //listaDisciplinaController.getListaDisciplinas(listaController.getListaAux());
        for (ListaDisciplina ld : listaDisciplinas) {
            this.disciplinaProfessors.add(ld.getDisciplinaProfessor());
        }
        return disciplinaProfessors;
    }

    public List<Turma> getTurmas() {
        turmas = getTurmaController().getTurmas(getDisciplinaProfessor());

        if (turmas == null) {
            turmas = new ArrayList<Turma>();
        }
        return turmas;
    }

    public void setTurmas(List<Turma> turmas) {
        this.turmas = turmas;
    }

    public DisciplinaProfessor getDisciplinaProfessor() {
        if (disciplinaProfessor == null || disciplinaProfessor.getDisciplina() == null) {
            if (getDisciplinaProfessors().size() > 0) {
                disciplinaProfessor = getDisciplinaProfessors().get(0);
            } else {
                disciplinaProfessor = new DisciplinaProfessor();
            }
        }
        return disciplinaProfessor;
    }

    public void setDisciplinaProfessor(DisciplinaProfessor disciplinaProfessor) {
        this.disciplinaProfessor = disciplinaProfessor;
    }

    public Turma getTurma() {

        if (turma == null) {
            if (getTurmas().size() > 0) {
                turma = getTurmas().get(0);
            } else {
                turma = new Turma();
            }
        }
        return turma;
    }

    public void setTurma(Turma turma) {
        this.turma = turma;
    }

    public List<Aluno> getAlunosLista() {
        if (alunosLista == null) {
            alunosLista = getAlunosLista(getListaController().getListaAux());
        }
        return alunosLista;
    }

    public void setAlunosLista(List<Aluno> alunosLista) {
        this.alunosLista = alunosLista;
    }

    public List<ListaAluno> getListaAlunosLista2(Lista lista) {
        listaAlunosLista = jpaController.findListaAluno(lista);
        return listaAlunosLista;
    }

    public List<Aluno> getAlunosLista(Lista lista) {
        alunosLista = new ArrayList<Aluno>();
        for (ListaAluno la : getListaAlunosLista2(lista)) {
            alunosLista.add(la.getAluno());
        }
        return alunosLista;
    }
    
    public List<ListaAluno> getListaAlunos(Aluno aluno) {

        listaAlunos = jpaController.findListaAluno(aluno);
        return listaAlunos;
    }

    public Aluno[] getSelectedAlunos() {
        return selectedAlunos;
    }

    public void setSelectedAlunos(Aluno[] selectedAlunos) {
        this.selectedAlunos = selectedAlunos;
    }

    public List<Aluno> getAlunos2() {

        if (alunos2 == null) {
            MatriculadoController matriculadoController = getMatriculadoController();

            alunos2 = new ArrayList<Aluno>();

            for (Matriculado m : matriculadoController.getMatriculados(getTurma())) {
                alunos2.add(m.getAluno());
            }
        }
        return alunos2;
    }

    public void setAlunos2(List<Aluno> alunos2) {
        this.alunos2 = alunos2;
    }

//    public DualListModel<Aluno> getAlunos() {
//        if (alunos == null) {
//            MatriculadoController matriculadoController = getMatriculadoController();
//
//            List<Aluno> source = new ArrayList<Aluno>();
//            List<Aluno> target = new ArrayList<Aluno>();
//
//            ListaController listaController = getListaController();
//
//
//            List<Aluno> alunosLista = getAlunosLista(listaController.getListaAux());
//
//            for (Matriculado m : matriculadoController.getMatriculados(getTurma())) {
//                if (alunosLista.contains(m.getAluno())) {
//                    target.add(m.getAluno());
//                } else {
//                    source.add(m.getAluno());
//                }
//            }
//
//            alunos = new DualListModel<Aluno>(source, target);
//        }
//        return alunos;
//    }
    public void setAlunos(DualListModel<Aluno> alunos) {
        this.alunos = alunos;
    }

    public ListaAlunoController(List<Turma> turmas) {
        this.turmas = turmas;
    }

    public String setPageListaAlunoCad() {
        clear();
        getPageManager().setPageListaAlunoCad();
        return "refreshPage";
    }

    public List<Turma> getTurmasDaLista() {

        if (turmasDaLista == null) {

            for (Aluno aluno : getAlunosLista(getListaController().getListaAux())) {

                for (Matriculado matriculado : getMatriculadoController().getMatriculados(aluno)) {
                    if (!turmasDaLista.contains(matriculado.getTurma())) {
                        turmasDaLista.add(turma);
                    }
                }
            }
        }

        return turmasDaLista;
    }

    public void setTurmasDaLista(List<Turma> turmasDaLista) {
        this.turmasDaLista = turmasDaLista;
    }

    public Lista getLista() {
        if(lista == null){
            lista = getListaController().getListasProfessor().get(0);
        }
        return lista;
    }

    public void setLista(Lista lista) {
        this.lista = lista;
    }
    private String notas[];

    public String[] getNotas() {
        return notas;
    }

    public void setNotas(String[] notas) {
        this.notas = notas;
    }

    public List<ListaAluno> getListaAlunosLista() {
        listaAlunosLista = getListaAlunosLista2(getLista());
        notas = new String[listaAlunosLista.size()];

        for (int i = 0; i < listaAlunosLista.size(); i++) {
            int nt = 0;
            ListaAluno la = listaAlunosLista.get(i);

            List<CorrecaoListaAluno> clas = getCorrecaoListaAlunoController().getCorrecaoListaAlunos(la);
            if (clas == null) {
                clas = new ArrayList<CorrecaoListaAluno>();
            }

            for (CorrecaoListaAluno cla : clas) {
                nt += cla.getNota();
            }
            notas[i] = Integer.toString(nt);
        }

        return listaAlunosLista;
    }

    public void setListaAlunosLista(List<ListaAluno> listaAlunosLista) {
        this.listaAlunosLista = listaAlunosLista;
    }

    public List<Aluno> getPAlunos() {
        pAlunos = new ArrayList<Aluno>();
        for (Matriculado m : getMatriculadoController().getMatriculados(getTurma())) {
            if (!getPAlunos2().contains(m.getAluno())) {
                pAlunos.add(m.getAluno());
            }
        }
        return pAlunos;

    }

    public void setPAlunos(List<Aluno> pAlunos) {
        this.pAlunos = pAlunos;
    }

    public List<Aluno> getPAlunos2() {
        if (pAlunos2 == null) {
//            for (Matriculado m : getMatriculadoController().getMatriculados(getTurma())) {
//                if (getListaAlunosLista2().contains(m.getAluno())) {
//                    pAlunos2.add(m.getAluno());
//                }
//            }
        }
//        
//        if (pAlunos2 == null) {
//            pAlunos2 = new ArrayList<Aluno>();
//        }
        return pAlunos2;
    }

    public void setPAlunos2(List<Aluno> pAlunos2) {
        this.pAlunos2 = pAlunos2;
    }

    public Aluno getSelectedAluno() {
        return selectedAluno;
    }

    public void setSelectedAluno(Aluno selectedAluno) {
        this.selectedAluno = selectedAluno;
    }

    public void addAluno() {
        Aluno aluno = (Aluno) JsfUtil.getObjectFromRequestParameter("alunoTemp");
        getPAlunos2().add(aluno);

    }

    public void removeAluno() {
        Aluno aluno = (Aluno) JsfUtil.getObjectFromRequestParameter("alunoTemp2");
        getPAlunos2().remove(aluno);
    }

    public void addAllAlunos() {
        getPAlunos2().addAll(getPAlunos());
    }

    public void removerAllAlunos() {
        getPAlunos2().clear();
    }
}
